AWSの負荷テストソリューションを試してみた
シナリオを用いた負荷テストツールとして JMeter や Gatling などがございますが、AWS でも負荷テストのソリューションが用意されております。
こちらのソリューションは、Fargate で 1 秒あたり選択した数のトランザクションを生成する数千規模の接続ユーザーを簡単にシミュレートできます。
本エントリでは、AWS の負荷テストソリューションを使った負荷テストを紹介します。
構成要素
公式の構成図を拝借しています。
フロントエンドでは、バックエンドの負荷テストエンジンを実行する API と、テストシナリオの作成やモニタリングに使用するウェブコンソールが提供されています。
なお、使用するテストシナリオには JMeter のシナリオを指定できるため、既に JMeter を使っている場合は簡単に大規模な負荷テストを行うこともできます。
バックエンドでは、負荷を生成するための Docker イメージを作成します。イメージには負荷テストフレームワークのTaurusが使われています。イメージやテストスクリプトを変更する際は、S3 から更新します。
フロントエンドの API で負荷テストを実行すると、Lambda から各タスクが起動され、負荷テストが開始されます。
制限
- 最大負荷は 10,000 の同時リクエスト(デフォルト)
- Fargate で起動できるデフォルトのタスク数は 50、タスクごとに最大で 200 の同時接続を生成します
- 同時リクエストを増やす場合、タスク数の上限緩和申請します
- テストの最大実行時間は 4 時間
コスト
ソリューションを使用することにコストはかかりませんが、使用した AWS サービス自体のコストは発生します。
サービスのコストは発生しますが、サーバレスな構成のためほとんど発生しません。
やってみた
前提
検証の構成です。ALB を前段にもつ Web サーバを用意し、5 つのタスクから同時接続して負荷かけます。
負荷テストのシナリオでネットワークトラフィックが 1Gbps を超える場合、AWS へ負荷テスト申請が必要です。負荷テスト実施の際は、Amazon EC2 Testing Policy を事前に確認します。
デプロイ/テスト
CloudFormation テンプレートを元にソリューションをデプロイします。
パラメータ設定では、コンソールにログインするためのユーザ名と初期 PW メールアドレスを入力します。VPC ネットワークはデフォルト値をそのまま使用します。
デプロイが完了後、コンソール URL と初期 PW が入力したメールアドレス宛に通知されるので、ログインします。
上部の[CREATE TEST]をクリックし、負荷テストの設定を行います。ここでは、3 分間で同時リクエスト数 1000 に達し、最大同時接続の負荷が 5 分間継続するように設定しています。
一般設定
項目 | 内容 | 備考 |
---|---|---|
Name | 負荷テストの名前 | |
Descriptio | テストシナリオの説明 | |
Task Count | 起動するDockerコンテナの数 | Max 100 |
Concurrency | タスクあたりの同時接続数 | Max 200 |
Ramp up | 同時接続数に達するまでの時間 | |
Hold For | 同時接続数を維持する時間 |
シナリオ設定
項目 | 内容 | 備考 |
---|---|---|
Test Type | シンプルテスト または JMater を選択 | |
HTTP endpoint under test | ターゲットのURL | シンプルテストの場合 |
HTTP Method | HTTPメソッド | シンプルテストの場合 |
HTTP Headers | HTTPヘッダ | シンプルテストの場合、オプション |
Body Payload | メッセージボディ | シンプルテストの場合、オプション |
各設定項目を入力し、[SUBMIT]をクリックすると、テストが開始されます。
しばらくすると、STATUS が COMPLETE となり、テストが完了しました。
平均応答時間、平均レイテンシー、平均接続時間といったテスト結果を得ることができました。Taurus のテスト結果の詳細については、Taurus のユーザーマニュアルから確認できます。
CloudWatch 側も確認してみます。ALB の Request Count から、3 分間で同時接続数 MAX に達して、5 分間継続して負荷がかかっているということを確認できました。
さいごに
AWS の負荷テストソリューションを使って、負荷テストをやってみました。
簡単に大規模な負荷テストを低コストで行えること、使い慣れた JMater のシナリオを流用できること、テスト用のコンテナやスクリプトのメンテナンスが容易であることは嬉しい点と思います。
負荷テストを実施する際には検討してはいかがでしょうか。